wayland: Don't invent our own unstable protocol semantics
authorJonas Ådahl <jadahl@gmail.com>
Mon, 7 Mar 2016 03:49:35 +0000 (11:49 +0800)
committerJonas Ådahl <jadahl@gmail.com>
Thu, 10 Mar 2016 04:31:15 +0000 (12:31 +0800)
The gtk_shell protocol used some half baked unstable protocol semantics
that worked by only allowing binding the exact version of the
interface. This hack is a bit too confusing and it makes it impossible
to do any compatible changes without breaking things.

So, instead rename it to include a number in the interface names. This
way we can add requests and events without causing compatibility issues,
and we can later remove requests and events by bumping the number in
the interface names.

https://bugzilla.gnome.org/show_bug.cgi?id=763001

gdk/wayland/gdkdisplay-wayland.c
gdk/wayland/gdkdisplay-wayland.h
gdk/wayland/gdkprivate-wayland.h
gdk/wayland/gdkscreen-wayland.c
gdk/wayland/gdkwindow-wayland.c
gdk/wayland/protocol/gtk-shell.xml

index c811f19d67ab40a334ded92ef3aa43860f6381a8..d80c2aed1e16a6db2eafc3585e5b812e2dd03ef5 100644 (file)
@@ -262,17 +262,14 @@ gdk_registry_handle_global (void               *data,
       xdg_shell_use_unstable_version (display_wayland->xdg_shell, XDG_SHELL_VERSION_CURRENT);
       xdg_shell_add_listener (display_wayland->xdg_shell, &xdg_shell_listener, display_wayland);
     }
-  else if (strcmp (interface, "gtk_shell") == 0)
+  else if (strcmp (interface, "gtk_shell1") == 0)
     {
-      if (version >= MINIMUM_GTK_SHELL_VERSION)
-        {
-          version = MIN (version, SUPPORTED_GTK_SHELL_VERSION);
-          display_wayland->gtk_shell =
-            wl_registry_bind(display_wayland->wl_registry, id,
-                             &gtk_shell_interface, version);
-          _gdk_wayland_screen_set_has_gtk_shell (display_wayland->screen);
-          display_wayland->gtk_shell_version = version;
-        }
+      display_wayland->gtk_shell =
+        wl_registry_bind(display_wayland->wl_registry, id,
+                         &gtk_shell1_interface,
+                         1);
+      _gdk_wayland_screen_set_has_gtk_shell (display_wayland->screen);
+      display_wayland->gtk_shell_version = version;
     }
   else if (strcmp (interface, "wl_output") == 0)
     {
@@ -666,8 +663,8 @@ gdk_wayland_display_notify_startup_complete (GdkDisplay  *display,
         return;
     }
 
-  if (display_wayland->gtk_shell_version >= GTK_SHELL_HAS_SET_STARTUP_ID)
-    gtk_shell_set_startup_id (display_wayland->gtk_shell, startup_id);
+  if (display_wayland->gtk_shell)
+    gtk_shell1_set_startup_id (display_wayland->gtk_shell, startup_id);
 
   g_free (free_this);
 }
index 297150ecfcbaa08f2a78e77a8ee3e9808066378c..5410cf3fa46f9d0de64f330312c13750bc11417a 100644 (file)
@@ -66,7 +66,7 @@ struct _GdkWaylandDisplay
   struct wl_compositor *compositor;
   struct wl_shm *shm;
   struct xdg_shell *xdg_shell;
-  struct gtk_shell *gtk_shell;
+  struct gtk_shell1 *gtk_shell;
   struct wl_input_device *input_device;
   struct wl_data_device_manager *data_device_manager;
   struct wl_subcompositor *subcompositor;
index a60c4c3bd231b39e7833321162ca7339e9af3989..cb2c29a8cbb50613addff51f16924e8d7aec420f 100644 (file)
 #define WL_SURFACE_HAS_BUFFER_SCALE 3
 #define WL_POINTER_HAS_FRAME 5
 
-#define SUPPORTED_GTK_SHELL_VERSION 3
-#define MINIMUM_GTK_SHELL_VERSION   2
-#define GTK_SHELL_HAS_SET_STARTUP_ID 3
-
 #define GDK_WINDOW_IS_WAYLAND(win)    (GDK_IS_WINDOW_IMPL_WAYLAND (((GdkWindow *)win)->impl))
 
 GdkKeymap *_gdk_wayland_keymap_new (void);
index 0ee0f54dd119705d24de62a8894d56751233f826..c146cd372926b6df36d886848582acddda53ce5c 100644 (file)
@@ -647,9 +647,9 @@ init_settings (GdkScreen *screen)
 }
 
 static void
-gtk_shell_handle_capabilities (void             *data,
-                              struct gtk_shell *shell,
-                              uint32_t          capabilities)
+gtk_shell_handle_capabilities (void              *data,
+                               struct gtk_shell1 *shell,
+                               uint32_t           capabilities)
 {
   GdkScreen *screen = data;
   GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (data);
@@ -661,7 +661,7 @@ gtk_shell_handle_capabilities (void             *data,
   notify_setting (screen, "gtk-shell-shows-desktop");
 }
 
-struct gtk_shell_listener gdk_screen_gtk_shell_listener = {
+struct gtk_shell1_listener gdk_screen_gtk_shell_listener = {
   gtk_shell_handle_capabilities
 };
 
@@ -670,7 +670,9 @@ _gdk_wayland_screen_set_has_gtk_shell (GdkScreen *screen)
 {
   GdkWaylandDisplay *wayland_display = GDK_WAYLAND_DISPLAY (GDK_WAYLAND_SCREEN (screen)->display);
 
-  gtk_shell_add_listener (wayland_display->gtk_shell, &gdk_screen_gtk_shell_listener, screen);
+  gtk_shell1_add_listener (wayland_display->gtk_shell,
+                           &gdk_screen_gtk_shell_listener,
+                           screen);
 }
 
 static void
@@ -764,7 +766,7 @@ set_decoration_layout_from_entry (GdkScreen        *screen,
 static gboolean
 set_capability_setting (GdkScreen                 *screen,
                         GValue                    *value,
-                        enum gtk_shell_capability  test)
+                        enum gtk_shell1_capability test)
 {
   GdkWaylandScreen *wayland_screen = GDK_WAYLAND_SCREEN (screen);
 
@@ -793,13 +795,16 @@ gdk_wayland_screen_get_setting (GdkScreen   *screen,
    }
 
   if (strcmp (name, "gtk-shell-shows-app-menu") == 0)
-    return set_capability_setting (screen, value, GTK_SHELL_CAPABILITY_GLOBAL_APP_MENU);
+    return set_capability_setting (screen, value,
+                                   GTK_SHELL1_CAPABILITY_GLOBAL_APP_MENU);
 
   if (strcmp (name, "gtk-shell-shows-menubar") == 0)
-    return set_capability_setting (screen, value, GTK_SHELL_CAPABILITY_GLOBAL_MENU_BAR);
+    return set_capability_setting (screen, value,
+                                   GTK_SHELL1_CAPABILITY_GLOBAL_MENU_BAR);
 
   if (strcmp (name, "gtk-shell-shows-desktop") == 0)
-    return set_capability_setting (screen, value, GTK_SHELL_CAPABILITY_DESKTOP_ICONS);
+    return set_capability_setting (screen, value,
+                                   GTK_SHELL1_CAPABILITY_DESKTOP_ICONS);
 
   if (strcmp (name, "gtk-dialogs-use-header") == 0)
     {
index 750975a3208424832aed51e422afefae514d892f..78295e5d338048fdf3f3939599224abeb0fcff3d 100644 (file)
@@ -102,7 +102,7 @@ struct _GdkWindowImplWayland
     struct wl_surface    *wl_surface;
     struct xdg_surface   *xdg_surface;
     struct xdg_popup     *xdg_popup;
-    struct gtk_surface   *gtk_surface;
+    struct gtk_surface1  *gtk_surface;
     struct wl_subsurface *wl_subsurface;
     struct wl_egl_window *egl_window;
     struct wl_egl_window *dummy_egl_window;
@@ -1779,7 +1779,7 @@ gdk_wayland_window_hide_surface (GdkWindow *window)
 
       if (impl->display_server.gtk_surface)
         {
-          gtk_surface_destroy (impl->display_server.gtk_surface);
+          gtk_surface1_destroy (impl->display_server.gtk_surface);
           impl->display_server.gtk_surface = NULL;
         }
 
@@ -2120,8 +2120,9 @@ gdk_wayland_window_init_gtk_surface (GdkWindow *window)
   if (display->gtk_shell == NULL)
     return;
 
-  impl->display_server.gtk_surface = gtk_shell_get_gtk_surface (display->gtk_shell,
-                                                 impl->display_server.wl_surface);
+  impl->display_server.gtk_surface =
+    gtk_shell1_get_gtk_surface (display->gtk_shell,
+                                impl->display_server.wl_surface);
 }
 
 static void
@@ -2134,9 +2135,9 @@ maybe_set_gtk_surface_modal (GdkWindow *window)
     return;
 
   if (window->modal_hint)
-    gtk_surface_set_modal (impl->display_server.gtk_surface);
+    gtk_surface1_set_modal (impl->display_server.gtk_surface);
   else
-    gtk_surface_unset_modal (impl->display_server.gtk_surface);
+    gtk_surface1_unset_modal (impl->display_server.gtk_surface);
 
 }
 
@@ -3024,13 +3025,13 @@ maybe_set_gtk_surface_dbus_properties (GdkWindow *window)
   if (impl->display_server.gtk_surface == NULL)
     return;
 
-  gtk_surface_set_dbus_properties (impl->display_server.gtk_surface,
-                                   impl->application.application_id,
-                                   impl->application.app_menu_path,
-                                   impl->application.menubar_path,
-                                   impl->application.window_object_path,
-                                   impl->application.application_object_path,
-                                   impl->application.unique_bus_name);
+  gtk_surface1_set_dbus_properties (impl->display_server.gtk_surface,
+                                    impl->application.application_id,
+                                    impl->application.app_menu_path,
+                                    impl->application.menubar_path,
+                                    impl->application.window_object_path,
+                                    impl->application.application_object_path,
+                                    impl->application.unique_bus_name);
   impl->application.was_set = TRUE;
 }
 
index 258442c6219bae07616ed9d68f76f332a85f41d1..1dc06a0a9e7298a32bcf31fe2a3715a0aadbdcb0 100644 (file)
@@ -1,12 +1,9 @@
 <protocol name="gtk">
 
-  <interface name="gtk_shell" version="3">
+  <interface name="gtk_shell1" version="1">
     <description summary="gtk specific extensions">
       gtk_shell is a protocol extension providing additional features for
-      clients implementing it. It is not backward compatible, and a client must
-      always only bind to the specific version it implements. If a client binds
-      to a version different from the version the server provides, an error will
-      be raised.
+      clients implementing it.
     </description>
 
     <enum name="capability">
     </event>
 
     <request name="get_gtk_surface">
-      <arg name="gtk_surface" type="new_id" interface="gtk_surface"/>
+      <arg name="gtk_surface" type="new_id" interface="gtk_surface1"/>
       <arg name="surface" type="object" interface="wl_surface"/>
     </request>
 
-    <request name="set_startup_id" since="3">
+    <request name="set_startup_id">
       <arg name="startup_id" type="string" allow-null="true"/>
     </request>
   </interface>
 
-  <interface name="gtk_surface" version="3">
+  <interface name="gtk_surface1" version="1">
     <request name="set_dbus_properties">
       <arg name="application_id" type="string" allow-null="true"/>
       <arg name="app_menu_path" type="string" allow-null="true"/>